<?php

/**
 * 
 * @desc URL请求解析类
 * 
 * @author keluo <pycorvn@yeah.net>
 * @since 2011-5-22 23:13:32
 * @link http://www.scabish.cn/framework
 */
class SCRequest {
	static private $_get = array();
	static private $_post = array();
	static private $_request = array();
	static private $_controllerName; // 当前请求的控制器名
	static private $_actionName; // 当前请求的方法名
	static private $_baseURI; // 当前请求基本url
	static private $_requestURI; // 当前请求的url
	static private $_segment = array();
	
	/**
	 *
	 * 解析当前请求
	 */
	public static function init() {
		self::parseRequestURI();
		self::parseBaseURI();
		self::parseGet();
		self::parsePost();
		self::parseRequest();
	
		//$_GET = $_POST = $_REQUEST = array();
	}
	
	/**
	 * 获取参数分隔段
	 * @param integer $index 索引
	 * @return string
	 */
	public static function segment($index) {
		return isset(self::$_segment[$index-1]) ? self::$_segment[$index-1] : false;
	}
	
	/**
	 * 
	 * 获取/设置当前GET请求中指定参数值
	 */
	public static function get() {
		$argNum = func_num_args();
		if(0 == $argNum) {
			return self::$_get;
		}
		if(1 == $argNum) {
			if(empty(self::$_get)) {
				return false;
			}
			if(false === array_key_exists(strtolower(func_get_arg(0)), self::$_get)) {
				return false;
			}
			return self::$_get[strtolower(func_get_arg(0))];
		}
		
		if(2 == $argNum) {
			self::$_get[func_get_arg(0)] = func_get_arg(1);
		}
	}
	
	/**
	 * 
	 * 获取/设置当前POST请求中指定参数值
	 */
	public static function post($key = '', $value = false) {
		$argNum = func_num_args();
		if(0 == $argNum) {
			return self::$_post;
		}
		
		if(1 == $argNum) {
			if(empty(self::$_post)) {
				return false;
			}
			if(false === array_key_exists(strtolower(func_get_arg(0)), self::$_post)) {
				return false;
			}
			return self::$_post[strtolower(func_get_arg(0))];
		}
		
		if( 2 == $argNum) {
			self::$_post[func_get_arg(0)] = func_get_arg(1);
		}
	}
	
	/**
	 * 
	 * 获取/设置当前REQUEST请求中指定参数值
	 */
	public static function request($key = '', $value = false) {
		$argNum = func_num_args();
		if(0 == $argNum) {
			return self::$_request;
		}
		
		if(1 == $argNum) {
			if(empty(self::$_request)) {
				return false;
			}
			if(false === array_key_exists(strtolower(func_get_arg(0)), self::$_request)) {
				return false;
			}
			return self::$_request[strtolower(func_get_arg(0))];
		}
		
		if( 2 == $argNum) {
			self::$_request[func_get_arg(0)] = func_get_arg(1);
		}
	}
	
	/**
	 * 
	 * 检查POST数据是否为空或合法
	 */
	public static function checkPost() {
		return self::$_post ? true : false;
	}
	
	/**
	 *
	 * 检查当前请求是否为post方式
	 */
	public static function isPost() {
		return strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') ? false : true;
	}
	
	/**
	 * 
	 * 获取当前所请求的控制器名
	 */
	public static function getControllerName() {
		return self::$_controllerName;
	}
	
	/**
	 * 
	 * 设置当前控制器名称
	 * @param string $name
	 */
	public static function setControllerName($name) {
		self::$_controllerName = $name;
	}
	
	/**
	 * 
	 * 获取当前所请求的方法名
	 */
	public static function getActionName() {
		return self::$_actionName;
	}
	
	/**
	 * 
	 * 设置当前所请求的方法名
	 * @param string $name
	 */
	public static function setActionName($name) {
		self::$_actionName = $name;
	}
	
	public static function getRequestURI() {
		if('' == self::$_requestURI) {
			self::parseBaseURI();
		}
		return self::$_requestURI;
	}
	
	/**
	 * 
	 * 获取当前请求基本URL(index.php之前的uri)
	 */
	public static function getBaseURI() {
		if('' == self::$_baseURI) {
			self::parseBaseURI();
		}
		return self::$_baseURI;
	}
	
	protected static function parseRequestURI() {
		$requestURI = strtolower(trim($_SERVER['REQUEST_URI'], '/'));
		$requestURI = preg_replace('/'.SCConfig::get('DB').'$/', '', $requestURI);
		self::$_requestURI = $requestURI;
	}
	
	protected static function parseBaseURI() {
		$self = strtolower(trim($_SERVER['PHP_SELF'], '/'));
		
		if(false !== strpos(SCConfig::getEntrance(), '?')) { // Nginx服务器pathinfo策略
			$self .= '?';
		}
        $baseURI = substr($self, 0, strpos($self, strtolower(SCConfig::getEntrance())));
        
        self::$_baseURI = $baseURI ? '/'.trim($baseURI, '/') : '';
	}
	
	/**
	 * 
	 * 解析GET请求
	 */
	protected static function parseGet() {
		$requestURI = strtolower(trim($_SERVER['REQUEST_URI'], '/'));
		$requestURI = preg_replace('/'.SCConfig::get('URL_SUFFIX').'$/', '', $requestURI);
		
        $request = trim(substr($requestURI, strlen(self::$_baseURI)), '/');
        if(0 === strpos($request, SC_ENTRY_FILE)) {
        	$request = trim(substr($request, strlen(SCConfig::getEntrance())), '/');
        }
        if(strlen($request)) {
        	self::$_segment = explode('/', $request);
        }
        $request = preg_replace('/^'.rtrim(SCConfig::getEntrance(), '?').'/i', '', $request);
        
        if(strlen($request)) {
        	$splits = explode('/', $request);
        	self::$_controllerName = $splits[0];
        	if(!isset($splits[1])) {
        		self::$_actionName = SCConfig::getDefaultController();
        	} else {
        		self::$_actionName = $splits[1];
        		array_shift($splits);
        		array_shift($splits);
        		if(!empty($splits)) {
        			if(count($splits) % 2 != 0) {
        				array_pop($splits);
        			}
        			 
        			$keys = $values = array();
        			for($idx = 0; $idx < count($splits); $idx++) {
        				if($idx % 2 == 0) {
        					$keys[] = $splits[$idx];
        				} else {
        					$values[] = $splits[$idx];
        				}
        			}
        			if(!empty($keys) && !empty($values)) {
        				self::$_get = array_combine($keys, $values);
        			}
        		}
        	}
        } else {
        	self::$_controllerName = SCConfig::getDefaultController();
        	self::$_actionName = SCConfig::getDefaultAction();
        }
	}
	
	/**
	 * 
	 * 解析POST请求
	 */
	protected static function parsePost() {
		self::$_post = $_POST;
		//self::$_post = array_map('trim', $_POST); // 预处理post变量会引起其他问题，比如通过二进制文件流，所以此处已不作处理
	}
	
	/**
	 *
	 * 解析REQUEST请求
	 */
	protected static function parseRequest() {
		self::$_request = array_merge(self::get(), self::post());
	}
}